home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Media 20
/
PC MEDIA CD20.iso
/
share
/
prog
/
cursoasm
/
cap1.msg
next >
Wrap
Text File
|
1993-06-16
|
12KB
|
184 lines
INTRODUCCION AL ASM: ARQUITECTURA
=================================
En el interior de un ordenador, el microprocesador (abreviadamente uP) es
un chip más interconectado a los chips de memoria, etc... La diferencia es que
es un chip que, además de ser capaz de responder a las señales que le llegan
del exterior, es capaz de generar señales para otros chips y recoger la
respuesta de éstos.
Supondremos en principio que tenemos un ordenador con un uP y un único
chip de memoria. Supondremos que el chip de memoria es de 64 kilobytes.
La memoria es igual que una serie de celdillas, en la que cada celdilla puede
contener un número entre 0 y 255d (0 y 0FFh), es decir, que está compuesta
de ocho bits. Las celdillas se numeran comenzando en la 0 y acabando en la
65535d (o 0FFFFh), y a este número o índice se le denomina 'dirección' de la
posición de memoria o celdilla. Por tanto, con un número entre 0 y 65535d se
identifica una posición de memoria en concreto. Una memoria soporta dos
operaciones distintas: LECTURA y ESCRITURA. Veremos cómo se realizan estas
dos operaciones a nivel de circuito.
De los pines o patillas del chip de memoria, los que más nos interesan son
los siguientes: CE o Chip Enable, RD/WR o Read/Write, las 16 patillas A0-A15,
y las ocho D0-D7. Estas patillas pueden estar a dos niveles, 0V o +5V. Para las
patillas de control se adopta una convención: si se dice que una patilla está
'activa a nivel alto' indica que cuando se quiere activar la función de una
patilla hay que ponerla a +5; y cuando se dice que es 'activa a nivel bajo'
indica que hay que ponerla a 0, y el nombre de la patilla se suele escribir
con una rayita por encima. Aquí, tomaremos la convención (para simplificar),
de que todas las patillas son activas a nivel alto. La patilla RD/WR indica
si la operación es lectura o escritura, y asumiremos que a nivel alto significa
lectura.
Cuando el circuito externo a la memoria quiere leer el dato de una deter-
minada posición de memoria, tiene que hacer varias cosas:
-Poner CE a nivel alto (activa el chip)
-Poner RD/WR a nivel alto (indica lectura)
-Poner en las lineas A0-A15 el número en binario de la dirección de mem.
de la que se quiere leer el dato. Para saber la señal que hay que
meter a partir de la dirección, tomamos un ejemplo:
Posición 23345d (decimal) -> 5B31h (hex.)->
0101101100110001b (binario)
Los bits o dígitos de un número se numeran empezando por la derecha con
el 0, 1,... hasta el 15 que es el de la izquierda en este caso.
Por tanto, para leer de esta posición la línea A0 debería estar a 5V
(representa un 1), las A1,A2 y A3 a 0v (representa un 0),...
-Esperar algunos ciclos de reloj (depende de la velocidad del chip) y
recoger el dato de las líneas D0-D7, que son los 8 dígitos binarios o
bits del número almacenado.
Cuando el circuito externo lo que quiere es escribir, debe hacer lo mismo
excepto que deberá poner RD/WR a nivel bajo y en lugar de leer el dato de D0-D7
deberá poner él mismo los bits del dato a escribir, a menudo algunos ciclos
después de poner CE activo y RD/WR a nivel bajo para dar tiempo al chip a
reaccionar.
El propio uP tiene las líneas A0-A15 entre sus pines, que van conectadas a
las A0-A15 de la memoria, y tiene también D0-D7 conectadas a las de la memoria.
También tiene una patilla RD/WR, que pone al valor correspondiente cuando
quiere acceder a la memoria. Y también tiene una patilla, que en el Z80 (el uP
que llevaban los Spectrum, los Amstrad CPC y los MSX) se llama MREQ (Memory
Request), que pone a nivel alto cuando quiere acceder a memoria (lectura o
escritura). Esta patilla, como habréis imaginado, va conectada al CE de la
memoria. A las líneas que interconectan el uP con otros dispositivos se les
denomina genéricamente 'bus', clasificándose en tres grupos funcionales: el
'bus de direcciones', formado por las líneas A0-A15, el 'bus de datos', formado
por las D0-D7, y el 'bus de control' que incluye todas las demás líneas. El
número de líneas para el bus de direcciones se denomina 'anchura del bus de
direcciones', y análogamente para el bus de datos. El modelo idealizado que
hemos visto tendría una anchura del bus de direcciones de 16 bits, y una
anchura del bus de datos de 8 bits. Este modelo es muy similar a la
arquitectura real de un Spectrum, por ejemplo.
Un uP determinado se diseña de manera que pueda reconocer ciertos números
como instrucciones que le indican hacer algo determinado. Estas instrucciones
que el uP es capaz de reconocer forman el 'conjunto de instrucciones' del uP,
y los números que le corresponden a cada una son los 'codigos de operación' de
las instrucciones. Algunas instrucciones sencillas son sólo un byte, otras
están formadas por 2 o más bytes. Una ristra de estas instrucciones del uP
forman un programa, y a este 'lenguaje', formado únicamente por números y que
entiende el uP directamente, se le llama código máquina. Al principio, los
ordenadores se programaban introduciendo directamente los códigos de operación
en la memoria, pero evidentemente además de tedioso resultaba de lo más
proclive a errores. Además, revisar un listado de números presenta una gran
dificultad para el programador. Por tanto, se define para cada uno de las
instrucciones del uP una palabra representativa de su función, a la que se
llama 'mnemónico', a la que eventualmente habrá que añadir los operandos para
poder generar el código de operación ('opcode') completo, ya que el código de
operación lleva información tanto de la instrucción a ejecutar como de los
operandos que ésta manejará. El programa que traduce un texto con instruc-
ciones en este nuevo lenguaje se denomina 'assembler' o 'ensamblador', y este
lenguaje de programación se denomina 'assembly language' o 'lenguaje ensam-
blador'. Algunos ensambladores conocidos para la familia 80x86 son el MASM o
Macro ASseMbler de Microsoft y el TASM o Turbo ASseMbler de Borland. El
programa DEBUG que viene con el MS-DOS o el SID que viene con el DR-DOS también
son capaces de traducir instrucciones ASM en sus correspondientes códigos de
operación, pero a un nivel mucho más primitivo que el MASM o el TASM.
Ahora que ya sabemos cómo el uP puede acceder a la memoria, y cómo son los
programas que ejecuta éste veamos cuál es la tarea del micro y que es lo que
hace constantemente.
Para que el uP ejecute un programa, se deben situar los códigos de operación
del programa a partir de una dirección determinada. A esta dirección a partir
de la que está el programa la denominamos 'dirección de comienzo' por razones
evidentes. El uP internamente tiene algo de memoria, muy poca, estructurada
en lo que se denomina 'registros'. Cada registro está formado por una serie de
bits, 16 para ser precisos en el 8086, de forma que puede contener un número
entero en un rango determinado (con 16 bits podremos almacenar números entre 0
y 65535d o 0FFFFh). Los registros dependen de cada uP en concreto, pero veremos
dos que existen en todo uP: el llamado 'Instruction Pointer' o 'IP' en el 8086,
y el registro de instrucción. Para comprender el funcionamiento de ambos,
veremos un modelo idealizado de un ordenador con un uP, un chip de memoria de
64K, un bus de direcciones de 16 bits, uno de datos de 8 bits y un conjunto de
instrucciones en el que todas tienen un código de operación de un sólo byte.
El uP tiene una patilla llamada CK habitualmente ('clock' o reloj), por el
que recibe una señal cuadrada producida por un cristal de cuarzo y algo más de
circuitería (señal cuadrada es una señal que periódica y alternativamente toma
dos valores, en el caso de los PCs 0V y +5V. La velocidad de un ordenador en
megahercios o megaciclos por segundo no es más que la frecuencia de la señal
de reloj). El uP realiza varias tareas, al ritmo del reloj que se le conecta.
Estas tareas requieren uno o varios ciclos de reloj, pero son siempre las
mismas y se repiten constantemente:
-Primero, el uP genera una lectura de memoria para leer el byte
contenido en la dirección de memoria indicada por IP. El valor
recibido se almacena en el registro de instrucción. Es decir, se
activan MREQ y RD/WR se pone a RD, poniendo el valor contenido en
IP en las líneas A0-A15. El valor que se lee de D0-D7 se introduce
en el registro de instrucción.
-El uP incrementa el registro IP en uno, para luego leer la siguiente
instrucción de la serie.
-El uP decodifica la instrucción del registro de instr., es decir, ve
qué significa, y la ejecuta. Esta ejecución puede implicar más accesos
a memoria para lectura/escritura, puede cambiar el IP directamente
para saltar a otra dirección (a modo del GOTO del basic), etc...
-Vuelve al primer paso, es decir, lee la siguiente instrucción.
Y así, el uP ejecuta su trabajo 'ad infinitum'. Esta secuencia se repite
incansablemente, a no ser que el micro reciba una señal que lo interrumpa, un
reset, o algún otro suceso poco habitual (las interrupciones son relativamente
poco habituales).
Antes de ver el funcionamiento del 8086 en concreto, que es el uP que la
arquitectura IBM PC define como estándar mínimo, revisaremos cómo se comunica
el uP con los periféricos, ya que hasta ahora sólo hemos visto la comunicación
con la memoria.
En un ordenador, además de la memoria existen otros dispositivos que
requieren que el uP interactúe con ellos. Estos dispositivos pueden ser el
módem, la tarjeta gráfica, el teclado,... entre muchos otros. Estos dispositi-
vos se comunican con el micro enviándole datos y recibiendo datos de éste.
Algunos son sólo de lectura (el uP sólo puede recibir datos de ellos), otros
sólo de escritura (el uP puede enviarles datos, pero ellos no envían nada a
éste), y muchos otros son tanto de lectura como de escritura.
Una de las maneras posibles sería hacer que el uP tuviese una patilla para
cada dispositivo, al igual que la MREQ, de forma que cuando quisiera acceder
a uno en concreto pusiese su patilla correspondiente a nivel activo y escri-
biese o leyese el dato de o en el bus de datos. Pero ya que los dispositivos
son muchos y los uP se diseñan de forma general para distintos circuitos, lo
que se hace es asignar a cada dispositivo un número o dirección, de forma
parecida a la que cada dirección de memoria identifica una celdilla, y poner
una patilla en el uP (llamada IORQ - Input Output ReQuest - en el Z80, en el
8086 tendrá un nombre parecido) que se pone a nivel activo cuando se quiere
acceder a cualquier dispositivo. Cada periférico (llamando periférico a todo
lo que no sea la memoria o el uP) debe responder sólo cuando IORQ esté activa
y lea en el bus de direcciones el número que le corresponde. Cada uno de estos
valores que se sitúan en el bus de direcciones se llama 'puerto de entrada/
salida'. Los puertos que le corresponden a cada dispositivo es una de las
cosas que identifican un estándar, en nuestro caso el estándar PC. Algunos
dispositivos, como la tarjeta gráfica, necesitan intercambiar muchos datos con
el uP y por tanto requieren varios puertos. Por cierto, cada tarjeta gráfica
tiene sus puertos estándar, por ejemplo los puertos de una Hércules monocromo
no coinciden en absoluto con los de una VGA color, y por tanto se pueden
montar ambas en el mismo ordenador.
En el siguiente capítulo saldremos de este ordenador idealizado para entrar
de lleno en la arquitectura segmentada de los compatibles PC, y veremos los
registros del 8086.
Salut!!!